package com.competition.web.admin.service;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

import com.admin.param.contract.IUpdateGenereateResult;
import com.admin.param.contract.IVisitCustomerResult;
import com.admin.vo.contract.IStaffInfoVO;
import com.basic.service.contract.IBaseService;
import com.competition.web.entity.Staff;

public interface IStaffService extends IBaseService<Staff> { 

	/**
	 * 获取员工
	 * @param staffNames
	 * @return
	 */
	<VO extends IStaffInfoVO> Map<String, VO> getStaff(String[] staffNames, Class<VO> target);
	
	List<Staff> staffsByLeaveTask(int start, Long currentTime, Long endTime);
	
	/**
	 * 更新状态
	 * @param staffs
	 * @param currentTime
	 * @param status
	 */
	public void updateStatus(List<Staff> staffs, Long currentTime, byte status);
	
	/**
	 * 统计数量
	 * @param leaveStart
	 * @param leaveEnd
	 * @return
	 */
	int countByLeaveToCache(long leaveStart, long leaveEnd);
	
	
	/**
	 * 处理 （请假 ---> 正常）
	 * @param leaveStart
	 * @param leaveEnd
	 * @param start
	 * @param selectCount
	 * @return
	 */
	List<Staff> parseLeaveToNormal(int start, Long currentTime, Long endTime);
	
	
	/**
	 * 统计数量（请假 ---> 正常）
	 * @param leaveStart
	 * @param leaveEnd
	 * @return
	 */
	Integer countByLeaveToNormal(long leaveStart, long leaveEnd);
	
	
	/**
	 * 获取员工
	 * @param <VO>
	 * @param assignIds
	 * @param function
	 * @return
	 */
	<VO> List<Staff> getStaffsFromCache(List<VO> assignIds, List<Function<VO, Integer>> function);
	
	/**
	 * 获取员工信息
	 * @param <VO>
	 * @param ids
	 * @param voClass
	 * @return
	 */
	<VO> List<VO> getStaffInfoByIds(IUpdateGenereateResult[] genereateResults,  Class<VO> voClass);
	
	
	/**
	 * 获取指派人员
	 * @param <VO>
	 * @param names
	 * @return
	 */
	<VO extends IStaffInfoVO> List<VO> getStaffNames(String[] names, Class<VO> target);
	
	
	
	/**
	 * 根据已选人数m中再随机挑选n人（n对应可拜访公司数量）每个销售轮空的次数将保持一致
	 * 过滤掉指派的员工
	 * @param ids
	 * @param voClass
	 * @param size
	 * @param assignIds 已经指派的员工id
	 * @return
	 */
	<VO> List<VO> getStaffInfoByIds(Integer[] ids,  Class<VO> voClass, int size, Integer[] assignIds);
	
	<VO> List<List<VO>> getStaffInfoByIds(IVisitCustomerResult customerResult,  Class<VO> voClass, Integer[] noonAndAfternoonSize, Integer[][] assignIds);
}
